home *** CD-ROM | disk | FTP | other *** search
-
- # Definition of the compiled code to kernel calls code.
- # Origin: Eric Jul, 1986-03-01.
- #
- # /* C O P Y R I G H T N O T I C E : */
- # /* Copyright 1986 Eric Jul and Norm Hutchinson. May not be used for any */
- # /* purpose without written permission from the authors. */
-
- # This defines a number of simple code pieces called by compiled code.
-
- sinclude(xkerneldefine)
-
- .globl _TaskQ
- .globl _currentSSP
- .globl _kernelsp
- .globl _ReturnOffStack
- .globl _BadJump
- .text
- LL0:
-
- include(../h/vax.regdefs.h)
- include(../h/consts.h)
-
- define(dosaveregs,
- moval SS_regs `(' regs_ssp `)'`,'scratch
- movq r1`,'(scratch)+
- movq r3`,'(scratch)+
- movq r5`,'(scratch)+
- movq r7`,'(scratch)+
- movl r9`,'(scratch)+
- movq r11`,'(scratch)+
- movq r13`,'(scratch)
- movl _kernelsp`,'sp
- )
-
- define(restoreregs,
- movl _currentSSP`,'regs_ssp
- moval SS_regs `(' regs_ssp `)' `,' scratch
- movq (scratch)+`,'r1
- movq (scratch)+`,'r3
- movq (scratch)+`,'r5
- movq (scratch)+`,'r7
- movl (scratch)+`,'r9
- movq (scratch)+`,'r11
- movq (scratch)`,'r13
- urun: .globl urun
- rsb
- )
-
- define(c_restoreregs,
- movl _currentSSP`,'regs_ssp
- moval SS_regs `(' regs_ssp `)' `,' scratch
- movq (scratch)+`,'r1
- movq (scratch)+`,'r3
- movq (scratch)+`,'r5
- movq (scratch)+`,'r7
- movl (scratch)+`,'r9
- movq (scratch)+`,'r11
- movq (scratch)`,'r13
- rsb
- )
-
- # All Emerald kernel entry points are defined using the following macros
- define(ementry,_$1: .globl _$1)
- define(emexit,rsb)
-
- define(DataBrand,0) # copied from ecTypes.h!!!
- # For calling C procedures
- define(call_c,
- `dosaveregs'
- `ifelse($1,3,
- pushl arg3
- pushl arg2
- pushl arg1)
- ifelse($1,2,
- pushl arg2
- pushl arg1)
- ifelse($1,1,
- pushl arg1)'
- calls `$'$1`,'_$2
- `ifelse($3,1,
- movl r0`,'arg1)'
- `c_restoreregs'
- )
-
- define(call_k,
- movl `$' DataBrand`,' SS_resultBrand `(' regs_ssp `)'
- `dosaveregs'
- `ifelse($1,3,
- pushl arg3
- pushl arg2
- pushl arg1)
- ifelse($1,2,
- pushl arg2
- pushl arg1)
- ifelse($1,1,
- pushl arg1)'
- calls `$'$1`,'_$2
- `ifelse($3,1,
- movl r0`,'arg1)'
- jmp kernel_exit
- )
-
- ########################################################################
- # Kernel exit code.
- # This is the common exit point for all calls to the C part of
- # the kernel
- ########################################################################
-
-
- .stabs "kernel_exit:F1",0x24,0,4,_kernel_exit
- _kernel_exit:
- .globl _kernel_exit
- .word 0
- kernel_exit:
- .globl kernel_exit
- ifdef(xkernel,
- ` calls $0, _doScheduling',
- ` cmpl $ _TaskQ,_TaskQ # Handle kernel tasks first.
- jneq cycle_mainLoop #
- tstl _currentSSP # if there is a process, run it
- jneq runit #
- calls $0,_ensureRunning # make one the current one
- cmpl $ _TaskQ,_TaskQ # To prevent losing preemption
- jneq cycle_mainLoop # signals that arrived
- # AFTER the last cycle of the
- # main loop but before the
- # resetting of the prempt flag.
- ')
-
- runit: # Run the process.
- ifdef(xkernel,
- ` movl sp, _kernelsp',)
- restoreregs
- # won't ever return here
- calls $0,_abort
-
- ifdef(xkernel,,`
- cycle_mainLoop:
- calls $0,_MainLoop # Cycle the task queue
- jmp kernel_exit # Retry kernel exit
- ')
- ########################################################################
- # ReturnOffStack
- # Processes return to here when they return off the bottom of a
- # Stack Segment.
- _ReturnOffStack: #
- call_k(0, DoReturnOffStack)
-
- ########################################################################
- # A local invocation was attempted to a non-resident piece of code
- # This usually indicates a kernel error.
- # The activation record is backed up (so the kernel can print
- # debug information about where the fault occurred).
- # The kernel is called -- and will abort.
- _BadJump:
- # Pop back to calling environment.
- movl (sp)+, r0
- movq (sp)+, regs_b
- movl (sp)+, regs_l
- movl r0, -(sp)
- call_k(0, BadJumpOccurred)
-
- ########################################################################
- # The kernel entry points follow.
-
- # The following is for dbx use only.
- .stabs "kernel_entry:F1",0x24,0,4,_kernel_entry
- _kernel_entry:
- .globl _kernel_entry
- .word 0
-
- ########################################################################
- # Process preemption, loops and routine entry.
- ########################################################################
-
- ementry(em_loopPreempt)
- call_k(0, LoopPreempt)
- emexit
-
- ########################################################################
- # stackCheck(stackMax)
- # Insure that the current stack segment allows for stackMax more
- # space to be allocated.
- # Usually, the compiler would generate code to do the stack check
- # and only call this routine, if the check failed.
- # The stack check could fail for two reasons:
- # The stack is too small and needs to be extended.
- # The process is to be preempted and its stack has been
- # cut down to cause it to fail the next stack check and thus
- # give up the CPU by calling the kernel.
- ########################################################################
-
- ementry(em_stackCheck)
- call_k(1,StackCheck)
- emexit
-
-
- ########################################################################
- # Operation entry and exit
- ########################################################################
-
- ementry(em_invoke)
- movl regs_b, arg3
- movl (sp)+, scratch
- movl (sp)+, regs_b
- addl2 $ 8, sp
- movl scratch, -(sp)
- # clrq -(sp)
- call_k(3, Invoke)
- emexit
-
- ementry(em_invokeWithMove)
- #new sequence
- movl regs_b, arg3 # callee GODP
- movl 12(sp), regs_b # caller GODP
- movl 8(sp), 20(sp) # return addr
- movq (sp), 12(sp) # move and visit mask
- addl2 $12, sp # clear away junk
- call_k(3, InvokeWithMove)
- emexit
-
- #old sequence
- #addl2 $ 8, sp
- #movl regs_b, arg3
- #movl (sp)+, scratch
- #movl (sp)+, regs_b
- #addl2 $ 8, sp
- #movl scratch, -(sp)
- #call_k(3, Invoke)
- #emexit
-
- ementry(em_initiallyDone)
- call_k(0, InitiallyDone)
- emexit
-
- ementry(em_endRecovery)
- call_k(0, InitiallyDone)
- emexit
-
- ########################################################################
- # Creation
- ########################################################################
-
- ementry(em_globalCreate)
- call_k(1,Create)
- emexit
-
- ementry(em_globalCreateSized)
- call_k(2,CreateSized)
- emexit
-
- ementry(em_localCreate)
- call_k(1,LocalCreate)
- emexit
-
- ementry(em_localQuickCreate)
- call_c(1,LocalQuickCreate)
- emexit
-
- ementry(em_localCreateSized)
- call_k(2,LocalCreateSized)
- emexit
-
- ementry(em_localQuickCreateSized)
- call_c(2,LocalQuickCreateSized)
- emexit
-
- # globalCreateVector(codePtr, sizeInBytes, upb)
- ementry(em_globalCreateVector)
- call_k(3,GlobalCreateVector)
- emexit
-
- # globalCreateVectorLiteral(codePtr, sizeOfEachElement, nElements)
- ementry(em_globalCreateVectorLiteral)
- call_k(3,CreateImmutableVectorLiteral)
- emexit
-
- # em_localCreateVector(codePtr, sizeInBytes, upb)
- ementry(em_localCreateVector)
- call_k(3,LocalCreateVector)
- emexit
-
- # localCreateVectorLiteral(codePtr, sizeOfEachElement, nElements)
- ementry(em_localCreateVectorLiteral)
- call_k(3,CreateImmutableVectorLiteral)
- emexit
-
- # em_createString(sizeInBytes)
- ementry(em_createString)
- call_c(1,CreateString)
- emexit
-
-
- ########################################################################
- # Not implemented
- ########################################################################
-
- ementry(em_notimpl)
- call_k(0,NotImplemented)
-
- ########################################################################
- # Monitors and conditions.
- ########################################################################
- ementry(em_monEntry)
- call_k(1,MonitorEntry)
- emexit
-
- ementry(em_monExit)
- tstl MonitorLock_waiting (arg1)
- jeql mE1
- call_k(1,MonitorExit)
- emexit
- mE1:
- clrl (arg1)
- emexit
-
-
- ementry(em_condInit)
- call_k(1,CondInit)
- emexit
-
-
- ementry(em_condWait)
- call_k(2,WaitCond)
- emexit
-
-
- ementry(em_condSignal)
- cmpl CondOD_theLock (arg2), arg1
- jneq csIllegal1
- tstl CondOD_waiting (arg2)
- jeql csNoWaiting
- csIllegal1:
- call_k(2,SignalCond)
- csNoWaiting:
- emexit
-
-
- ementry(em_condSignalAndExit)
- cmpl CondOD_theLock (arg2), arg1
- jneq csIllegal2
- tstl CondOD_waiting (arg2)
- jeql _em_monExit
- csIllegal2: # let the kernel handle this
- call_k(2,SignalAndExitCond)
- emexit
-
-
- ementry(em_condAwaiting)
- tstl CondOD_waiting (arg1)
- movpsl arg1
- extv $ 2,$ 1,arg1,arg1
- incl arg1
- emexit
-
-
- # old version of em_condAwaiting
- # clrl scratch
- # tstl CondOD_waiting (arg1)
- # jeql csQueueEmpty
- # incl scratch
- #csQueueEmpty:
- # movl scratch,arg1
- # emexit
-
-
- ########################################################################
- # Location dependent operations
- ########################################################################
-
- ementry(em_isFixed)
- call_k(2,IsFixed)
- emexit
-
-
- ementry(em_unFix)
- call_k(2,UnFix)
- emexit
-
-
- ementry(em_fix)
- call_k(2,Fix)
- emexit
-
- ementry(em_locate)
- call_k(2,Locate)
- emexit
-
- ementry(em_move)
- call_k(2, Move)
- emexit
-
- ########################################################################
- # delay, waitUntil
- ########################################################################
-
- ementry(em_delay)
- call_k(1,Delay)
- emexit
-
- ementry(em_waitUntil)
- call_k(1,WaitUntil)
- emexit
-
- ########################################################################
- # Assertion failure (caused by erroneous user program)
- ########################################################################
-
- ementry(em_assertionFailure)
- call_k(0,AssertFailed)
- emexit
-
- ementry(em_returnAndFail)
- call_k(0,ReturnAndFail)
- emexit
-
- ########################################################################
- # InvokeAssumption failure (caused by system error) #
- ########################################################################
- # params (fG, fAbConPtr, fB)
- ementry(em_invokeAssumptionFailure)
- call_k(3,InvokeAssumptionFailed)
- emexit
-
- ########################################################################
- # BadSignal handling (caused by NIL references)
- ########################################################################
- .data
- _BadSigPC:
- .globl _BadSigPC
- .align 2
- .long 0
- .align 2
- .text
- _BadSigJumpPoint:
- .globl _BadSigJumpPoint
- movl _BadSigPC, -(sp)
- call_k(0,BadSignalOccurred)
- emexit
-
- ########################################################################
- # Line number tracing
- ########################################################################
- # Note: this entry point may be called from anywhere between two
- # Emerald statements and should save and restore all registers
-
- ementry(em_trace)
- movl r0,_registerSave
- moval _registerSave+4,r0
- movq r1,(r0)+
- movq r3,(r0)+
- movq r5,(r0)+
- movq r7,(r0)+
- movq r9,(r0)+
- movq r11,(r0)+
- movq r13,(r0)
- movl _kernelsp,sp
- calls $0,_LineNumber
- moval _registerSave+4,r0
- movq (r0)+,r1
- movq (r0)+,r3
- movq (r0)+,r5
- movq (r0)+,r7
- movq (r0)+,r9
- movq (r0)+,r11
- movq (r0),r13
- movl _registerSave,r0
- emexit
-
-
- ########################################################################
- # View changes, Conformity, and Restrict
- ########################################################################
-
- ementry(em_changeviewptr)
- call_k(2,ChangeViewPtr)
- emexit
-
- ementry(em_tryviewptr)
- call_k(3,ViewPtr)
- emexit
-
- ementry(em_conform)
- call_k(2,Conform)
- emexit
-
- ementry(em_restrictptr)
- call_k(3, RestrictPtr)
- emexit
-
- ########################################################################
- # Node operations #
- ########################################################################
-
- ementry(em_getAllNodes)
- call_k(0,Node_getAllNodes)
- emexit
-
- ementry(em_getActiveNodes)
- call_k(0,Node_getActiveNodes)
- emexit
-
- ementry(em_getNodeInformation)
- call_k(1,Node_getNodeInformation)
- emexit
-
- ementry(em_setNodeEventHandler)
- call_k(2,Node_setNodeEventHandler)
- emexit
-
- ementry(em_removeNodeEventHandler)
- call_k(2,Node_removeNodeEventHandler)
- emexit
-
- ########################################################################
-
- ementry(em_getStdOut)
- call_k(0,GetStdOut)
- emexit
-
- ementry(em_getStdIn)
- call_k(0,GetStdIn)
- emexit
-
- ementry(em_getMyStdOut)
- call_k(0,GetMyStdOut)
- emexit
-
- ementry(em_getMyStdIn)
- call_k(0,GetMyStdIn)
- emexit
-
- # em#####entry(emx_nextevent)
- # call_k(1,EMXReadEvent)
- # emexit
-
- ementry(em_getName)
- call_k(0,Node_getName)
- emexit
-
- ########################################################################
- # I/O
- ########################################################################
-
- ementry(em_read)
- call_k(2,StreamRead)
- emexit
-
- ementry(em_write)
- call_k(3,StreamWrite)
- emexit
-
- ementry(em_closeInStream)
- call_k(1,CloseInStream)
- emexit
-
- ementry(em_closeOutStream)
- call_k(1,CloseOutStream)
- emexit
-
- ########################################################################
- # Checkpoint
- ########################################################################
-
- ementry(em_checkpoint)
- call_k(3,Checkpoint)
- emexit
-
- ########################################################################
- # ownName and ownType
- ########################################################################
-
- ementry(em_ownName)
- call_k(1,OwnName)
- emexit
-
- ementry(em_ownType)
- call_k(1,OwnType)
- emexit
-
-
-